Asynchronni komunikace

Otázka od: Pavel Hauptman

5. 8. 2004 12:29

Zdravim vsechny,

potreboval bych napsat v D7 konzolovou aplikaci pro komunikaci s bufferem na
seriovem portu. Hledal jsem snad vsude na netu, ale vse co jsem nasel byli
jen VCL komponenty. A nebo byly placene. Pisu programek pro sebe, takze
penize do toho dat nechci. A nebo jestli nevite, jak to napsat vlastnimi
silami, kam se mam podivat pro inspiraci. Nikdy jsem se seriovou komunikaci
nezabyval. Zkousel jsem to pres SYSASER, ale ta je synchronni (takze se mi z
bufferu vracely nesmysly) a ja bych potreboval asynchronni.

Diky a s pozdravem

Pavel Hauptman


Odpovedá: Lukas Gebauer

5. 8. 2004 13:21

> potreboval bych napsat v D7 konzolovou aplikaci pro komunikaci s
> bufferem na seriovem portu. Hledal jsem snad vsude na netu, ale vse co
> jsem nasel byli jen VCL komponenty. A nebo byly placene. Pisu
> programek pro sebe, takze penize do toho dat nechci. A nebo jestli
> nevite, jak to napsat vlastnimi silami, kam se mam podivat pro
> inspiraci. Nikdy jsem se seriovou komunikaci nezabyval. Zkousel jsem
> to pres SYSASER, ale ta je synchronni (takze se mi z bufferu vracely
> nesmysly) a ja bych potreboval asynchronni.

??? proc by Synaser mel vracet nesmysly kvuli tomu, ze se Synaserem
komunikuje tvuj program synchronne? (neplet si synchronnost Synaseru
vuci aplikaci se synchronnim/asynchronnim rezimem serioveho portu...)

--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Slavomir Skopalik

5. 8. 2004 13:22

> potreboval bych napsat v D7 konzolovou aplikaci pro
> komunikaci s bufferem na seriovem portu. Hledal jsem snad
> vsude na netu, ale vse co jsem nasel byli jen VCL komponenty.

To se nevylucuje.

> A nebo byly placene. Pisu programek pro sebe, takze penize do
> toho dat nechci. A nebo jestli nevite, jak to napsat
> vlastnimi silami, kam se mam podivat pro inspiraci. Nikdy
> jsem se seriovou komunikaci nezabyval. Zkousel jsem to pres
> SYSASER, ale ta je synchronni (takze se mi z bufferu vracely
> nesmysly) a ja bych potreboval asynchronni.

SYNASER nepouzivam, ale nemel by to byt problem, zvlaste pokud nemas
vlastni smycku pro obsluhu
zprav. Pak ti totiz nic jineho, nez blokujici pristup nezbyva (muzes se
ovsem periodicky dotazovat
na pocet byte ve vstupnim bufferu).

Pak to jeste muzes resit pomoci API Windows, neni to zase tak strasny
jak to na prvni pohled vypada.
Neco malo o seriove komunikaci je na mojem webu, ale spise je to popis
pro dotaz odpoved protokol.

 Slavek

Ing. Slavomir Skopalik
Jednatel spolecnosti
Elekt Labs s.r.o.
Chaloupky 158
783 72 Velky Tynec
Czech Republic
--------------------------------------------
Mobil: +420 724 207 851
icq:199 118 333
e-mail:skopalik@elektlabs.cz
http://www.elektlabs.cz


Odpovedá: Lukas Gebauer

5. 8. 2004 13:26

> SYNASER nepouzivam, ale nemel by to byt problem, zvlaste pokud nemas
> vlastni smycku pro obsluhu zprav. Pak ti totiz nic jineho, nez
> blokujici pristup nezbyva (muzes se ovsem periodicky dotazovat na
> pocet byte ve vstupnim bufferu).
>
> Pak to jeste muzes resit pomoci API Windows, neni to zase tak strasny
> jak to na prvni pohled vypada. Neco malo o seriove komunikaci je na
> mojem webu, ale spise je to popis pro dotaz odpoved protokol.

Synaser neni de-facto nic jineho nez vsechny ty potrebne API funkce
zabalene do objektu. Tedy pouzivani je o velky krok pohodlnejsi nez
volanim primo API funkci, nicmene vrstva mezi tvoji aplikaci a API je
pomerne tenka, takze te to na funkcnostech neomezuje. Vse co dokazes
se seriovym portem pres API, dokazes i s pomoci Synaseru.

Navic to objektove zapouzdreni v sobe skryva vsecny rozdily mezi
Windows a Linux platformou. Takze tvuj kod opirajici-se o Synaser je
velmi snadno prenositelny mezi Windows a Linuxem.

V objektovem zapozdreni je take mnoho ruznych rozsirenych metod na
posilani a prijimani dat, takze je treba mozno napriklad pohodlne
nacitat data po radcich textu, atd.



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Pavel Hauptman

5. 8. 2004 13:34

Aha, tak jsem se spatne vyjadril. Muj seriovy buffer komunikuje v
asynchronnim rezimu. Jen tak pro zajimavost, zasilam kod, kterym zkousim
komunikovat s tim bufferem. Nejdriv poslu CRLF, bratit by mel "BF>". Pak
poslu znah "H" a CRLF a melo by se vratit nekol radku (menu pro nastaveni
bf.) Jenze kdyz ten samy kod pustim nekolikrat za sebou, dostanu pokazde
jinou odpoved:
1. spusteni - bf vrati pouze znak H
2. spusteni - vrati spravne znaky, tak ja je ocekavam
3. spusteni - opet bf vrati pouze znak H
4. spusteni - vrati jen cast ocekavaneho textu.

begin
  com := TBlockSerial.Create;
  com.RaiseExcept := false;
  try
    com.Connect('COM1');
    com.Config(9600, 8, 'N', 0, false, true);
    com.SendString('h' + #13#10);
    com.Flush;
    while com.LastError = 0 do begin
      write(char(com.RecvByte(1000)));
    end;
    com.Flush;
    com.Free;
  except
    on Exception do com.Free;
  end;
end;

> ??? proc by Synaser mel vracet nesmysly kvuli tomu, ze se Synaserem
> komunikuje tvuj program synchronne? (neplet si synchronnost Synaseru
> vuci aplikaci se synchronnim/asynchronnim rezimem serioveho portu...)
>
> --
> Lukas Gebauer.


Odpovedá: Lukas Gebauer

5. 8. 2004 14:58

> Aha, tak jsem se spatne vyjadril. Muj seriovy buffer komunikuje v
> asynchronnim rezimu. Jen tak pro zajimavost, zasilam kod, kterym
> zkousim komunikovat s tim bufferem. Nejdriv poslu CRLF, bratit by mel
> "BF>". Pak poslu znah "H" a CRLF a melo by se vratit nekol radku (menu
> pro nastaveni bf.) Jenze kdyz ten samy kod pustim nekolikrat za sebou,
> dostanu pokazde jinou odpoved: 1. spusteni - bf vrati pouze znak H 2.
> spusteni - vrati spravne znaky, tak ja je ocekavam 3. spusteni - opet
> bf vrati pouze znak H 4. spusteni - vrati jen cast ocekavaneho textu.

No, kod ktery jsi poslal dela neco jineho nez tady pises... tanm
totiz rovnou posilas "h" a CRLF a pak ctes byte po bytu co ti to
vratilo.

Zkus nejdriv poslat skutecne CRLF, pak si pomoci RecvTerminated
pockej az ti prijde zpet ten prompt, a pak pomoci RecvString cti
jednotlive radky menu.



--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.


Odpovedá: Pavel Hauptman

6. 8. 2004 8:37

    com.SendString(#13#10);
    write(com.RecvTerminated(1000, '>')); // ocekavam prompt BF>
    com.SendString('h' + #13#10);
    write(com.Recvstring(1000)); // ocekavam nekolik radku textu

Tak jsem to zkusil. Vysledek je tento:
1. spusteni - na konzoli se objevi prazdny radek CRLF, na druhem je "BF"
2. spusteni - na konzoli se objevi prazdny radek CRLF, na dalsich pak text,
ktery ocekavam.

Proc pri kazdem spusteni mi to vraci odlisne udaje? Cekal bych, ze na
konzoli se mi zobrazi prompt a na dalsich radcich ocekavany text

Proc se mi zobrazi i odeslane znaky do bufferu. Pritom paramtery prenosu
jsou nastaveny dobre, kontrolovano na terminalu.

PH.

> Zkus nejdriv poslat skutecne CRLF, pak si pomoci RecvTerminated
> pockej az ti prijde zpet ten prompt, a pak pomoci RecvString cti
> jednotlive radky menu.
>
>
>
> --
> Lukas Gebauer.


Odpovedá: Milan Tomes

6. 8. 2004 9:15

To, ze se Ti tam neobjevi ten terminator je jednoduche - Synaser stejne tak
jako Synapse tento znak odfiltruje... Ja to delam takto - pokud to neskonci
na timeout, tak si k nactenemu stringu pridam ten terminator (dalsi moje
rutiny s timto znakem pocitaji)...

S pozdravem

Milan Tomes

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Pavel Hauptman
> Sent: Friday, August 06, 2004 9:37 AM
>
> com.SendString(#13#10);
> write(com.RecvTerminated(1000, '>')); // ocekavam prompt BF>
> com.SendString('h' + #13#10);
> write(com.Recvstring(1000)); // ocekavam nekolik radku textu
>
> Tak jsem to zkusil. Vysledek je tento:
> 1. spusteni - na konzoli se objevi prazdny radek CRLF, na druhem je "BF"


Odpovedá: Lukas Gebauer

6. 8. 2004 9:38

> Proc pri kazdem spusteni mi to vraci odlisne udaje? Cekal bych, ze na
> konzoli se mi zobrazi prompt a na dalsich radcich ocekavany text
>
> Proc se mi zobrazi i odeslane znaky do bufferu. Pritom paramtery
> prenosu jsou nastaveny dobre, kontrolovano na terminalu.

Co odesilas, cpu do serioveho portu, a co ze serioveho portu dostanu,
to prectes. Tedy chybu hledej v tom tvem bufferu, ja s timhle vubec
nic nenadelam!

Tvuj buffer patrne dela echo vsech prichozich bytu dat. To aby kdyz
si to pustis v nejakem terminalu, abys videl co pises. Bud tvuj
buffer donut, aby to echo nedelal, nebo s tim musis v programu
pocitat!

Tvuj soucasny kod s tim nepocita, a proto je zmateny... Do ocekavane
odpovedi bufferu se ti totiz mota echo tebou odeslanych dat, a tak se
logicky rozsynchronizujes... ty ocekavas, zes precel odpoved od
bufferu, a zatim jsi precetl jen svoji vlastni ozvenu.


--
Lukas Gebauer.

E-mail: gebauerl@mlp.cz
http://www.ararat.cz/synapse/ - Ararat Synapse - TCP/IP Lib.